require"iuplua"
-- START CHANGELOG --
-- WHO     WHEN      WHAT
-- mvh     ?         Creation
-- DaPo    201304xx  Added reload button for easy external editing


if notepad==nil then
	notepad = {}

	-- Notepad Dialog

	notepad.lastfilename = nil -- Last file open
	notepad.mlCode = iup.multiline{expand="YES", size="200x120", font="Courier, 10"}
	notepad.lblPosition = iup.label{title="Lin 0, Col 0", size="50x"}
	notepad.lblFileName = iup.label{title="", size="50x", expand="HORIZONTAL"}

	function notepad.mlCode:caret_cb(lin, col)
	  notepad.lblPosition.title = "Lin ".. lin .. ", Col " .. col
	end

	function notepad.New()
	  notepad.mlCode.value=''
	  notepad.lblFileName.title = ''
	  notepad.lastfilename = nil
	end

	notepad.butExecute = iup.button{size="50x15", title="Execute",
					    action="iup.dostring(notepad.mlCode.value)"}
	notepad.butNewCommands = iup.button{size="50x15", title="New", action=notepad.New}
	notepad.butLoadFile = iup.button{size="50x15", title="Load..."}
	notepad.butReloadFile = iup.button{size="50x15", title="Reload"}
	notepad.butSaveasFile = iup.button{size="50x15", title="Save As..."}
	notepad.butSaveFile = iup.button{size="50x15", title="Save"}

	function notepad.butSaveFile:action()
	  if (notepad.lastfilename == nil) then
	    notepad.butSaveasFile:action()
	  else
	    newfile = io.open(notepad.lastfilename, "w+")
	    if (newfile) then
	      newfile:write(notepad.mlCode.value)
	      newfile:close()
	    else
	      error ("Cannot Save file: "..filename)
	    end
	  end
	end

	function notepad.butSaveasFile:action()
	  local fd = iup.filedlg{dialogtype="SAVE", title="Save File",
				 nochangedir="NO", directory=notepad.last_directory,
				 filter="*.*", filterinfo="All files",allownew=yes}

	  fd:popup(iup.LEFT, iup.LEFT)

	  local status = fd.status
	  notepad.lastfilename = fd.value
	  notepad.lblFileName.title = fd.value
	  notepad.last_directory = fd.directory
	  fd:destroy()

	  if status ~= "-1" then
	    if (notepad.lastfilename == nil) then
	      error ("Cannot Save file "..filename)
	    end
	    local newfile=io.open(notepad.lastfilename, "w+")
	    if (newfile) then
	      newfile:write(notepad.mlCode.value)
	      newfile:close(newfile)
	    else
	      error ("Cannot Save file")
	    end
	   end
	end

	function notepad.LoadFile(filename)
	  local newfile = io.open (filename, "r")
	  if (newfile == nil) then
	    error ("Cannot load file "..filename)
	  else
	    notepad.mlCode.value=newfile:read("*a")
	    newfile:close (newfile)
	    notepad.lastfilename = filename
	    notepad.lblFileName.title = notepad.lastfilename
	  end
	end

	function notepad.butLoadFile:action()
	  local fd=iup.filedlg{dialogtype="OPEN", title="Load File",
			       nochangedir="NO", directory=notepad.last_directory,
			       filter="*.*", filterinfo="All Files", allownew="NO"}
	  fd:popup(iup.CENTER, iup.CENTER)
	  local status = fd.status
	  local filename = fd.value
	  notepad.last_directory = fd.directory
	  fd:destroy()

	  if (status == "-1") or (status == "1") then
	    if (status == "1") then
	      error ("Cannot load file "..filename)
	    end
	  else
	    notepad.LoadFile(filename)
	  end
	end
	
	function notepad.butReloadFile:action()
		if notepad.lastfilename ~= nil then
			local filename = notepad.lastfilename
			notepad.LoadFile(filename)
		end
	end

	notepad.vbxNotepad = iup.vbox
	{
	  iup.frame{iup.hbox{iup.vbox{notepad.butLoadFile,
					  notepad.butReloadFile,
				      notepad.butSaveFile,
				      notepad.butSaveasFile,
				      notepad.butNewCommands,
				      notepad.butExecute,
				      margin="0x0", gap="10"},
			     iup.vbox{notepad.lblFileName,
				      notepad.mlCode,
				      notepad.lblPosition,
				      alignment = "ARIGHT"},
			     alignment="ATOP"}, title="Commands"}
	   ,alignment="ACENTER", margin="5x5", gap="5"
	}

	-- Main Menu Definition.

	notepad.mnuMain = iup.menu
	{
	  iup.submenu
	  {
	    iup.menu
	    {
	      iup.item{title="Exit", action="return iup.CLOSE"}
	    }, title="&File"
	  },
	--  iup.submenu{iup.menu
	--  {
	--    iup.item{title="Print Version Info...", action=notepad.print_version_info},
	--    iup.item{title="About...", action="notepad.dlgAbout:popup(iup.CENTER, iup.CENTER)"}
	--  },title="Help"}
	}

	-- Main Dialog Definition.

	notepad.dlgMain = iup.dialog{notepad.vbxNotepad,
					 title="Lua Notepad",
					 menu=notepad.mnuMain,
					 dragdrop = "YES",
					 defaultenter=notepad.butExecute}

	function notepad.dlgMain:dropfiles_cb(filename, num, x, y)
	  if (num == 0) then -- only the first one
	    notepad.LoadFile(filename)
	  end
	end

	function notepad.dlgMain:close_cb()
	  --iup.ExitLoop()  -- should be removed if used inside a bigger application
	  notepad.dlgMain:destroy()
	  notepad=nil;
	  return iup.IGNORE
	end

	-- Displays the Main Dialog

	notepad.dlgMain:show()
	notepad.mlCode.size = nil -- reset initial size, allow resize to smaller values
	iup.SetFocus(notepad.mlCode)

	if (iup.MainLoopLevel()==0) then
	  iup.MainLoop()
	end
else
	iup.SetFocus(notepad.mlCode)
end	
